﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Interfaces.Servicos;
using LM.InterfacesFabricas.Utilidades;
using LM.Negocio.Objetos;
using LM.Negocio.Validadores;
using LM.Repositorios;
using LM.Repositorios.Interfaces;

namespace LM.Servicos
{
    public class ServicoDeOperador : IServicoDeOperador
    {
        public void Cadastre(DtoOperador operador)
        {
            var repositorioDeOperador = FabricaDeRepositorios.Crie<IRespositorioDeOperador>();
            var validadorDeOperador = new ValidadorDeOperador(repositorioDeOperador);
            var operadorObjeto = ConversorDeObjetos.Copie<Operador>(operador);

            validadorDeOperador.ValideCadastro(operadorObjeto);

            repositorioDeOperador.Cadastre(operadorObjeto);
        }

        public void Atualize(DtoOperador operador)
        {
            var repositorioDeOperador = FabricaDeRepositorios.Crie<IRespositorioDeOperador>();
            var validadorDeOperador = new ValidadorDeOperador(repositorioDeOperador);
            var operadorObjeto = ConversorDeObjetos.Copie<Operador>(operador);

            validadorDeOperador.ValideAtualizacao(operadorObjeto);

            repositorioDeOperador.Atualize(operadorObjeto);
        }

        public void Exclua(int codigo)
        {
            var repositorioDeOperador = FabricaDeRepositorios.Crie<IRespositorioDeOperador>();
            var validadorDeOperador = new ValidadorDeOperador(repositorioDeOperador);
            var enderecoObjeto = ConversorDeObjetos.Copie<Operador>(repositorioDeOperador.Consulte(codigo));

            validadorDeOperador.ValideExclusao(enderecoObjeto);

            repositorioDeOperador.Exclua(enderecoObjeto);
        }

        public DtoOperador Consulte(int codigo)
        {
            var operadorObjeto = FabricaDeRepositorios.Crie < IRespositorioDeOperador>().Consulte(codigo);

            return ConversorDeObjetos.Copie<DtoOperador>(operadorObjeto);
        }

        public IList<DtoOperador> ConsulteTodos()
        {
            return ConversorDeObjetos.Copie<DtoOperador, Operador>(FabricaDeRepositorios.Crie<IRespositorioDeOperador>().ConsulteTodos());
        }
    }
}
